"use strict"
const mvc = require('cosjs.mvc');
const { mood } = require('../../../share/format/unit');
const like = require('../grow/like.js');
/**
 * @name stage
 * 主线战斗
 */
// const BATTLETYPE = 1;
// const TICKET = 60100500;
// const YELLOW = 60100002;
// const EXP = 60100001;

// /**
//  * @name startBattle
//  * @param int id 关卡ID
//  * @tip 主线通关记录在role.stage里
//  * 创建战斗
//  */
// exports.startBattle = async function () {
//     let id = this.get('id', 'int');
//     if (!id) {
//         return this.quick_error('N2BS1', "参数缺失");
//     }
//     let hookStageFlag = false;
//     let stageConfig = this.config("stage", id);
//     if (!stageConfig) {
//         stageConfig = this.config("onHookBattle", id);
//         if (!stageConfig) {
//             return this.quick_error("m2sgrbs1", "关卡配置不存在", id);
//         }
//         hookStageFlag = true;
//         stageConfig['stageType'] = "normal";
//     }



//     let battleData = { "stageID": id, "id": this.uid, "monsterNum": 0 }
//     // //判断是主线还是挂机
//     this.updater.role.key('stage.' + stageConfig['stageType']);
//     this.updater.role.key('lastHangStage');
//     this.updater.role.key('lastStage');
//     await this.updater.data();
//     let lastHangStage = this.updater.role.get('lastHangStage') || 0;
//     let lastStage = this.updater.role.get('stage.' + stageConfig['stageType']);
//     //判断前置条件
//     if (hookStageFlag) {
//         if (stageConfig["stageIdbefore"]) {
//             let beforeStageConfig = this.config("stage", stageConfig["stageIdbefore"]);
//             if (!beforeStageConfig) {
//                 beforeStageConfig = this.config("onHookBattle", stageConfig["stageIdbefore"]);
//                 if (!beforeStageConfig) {
//                     return this.quick_error("m2sgrbs1", "关卡配置不存在", stageConfig["stageIdbefore"]);
//                 }
//             }
//             this.updater.role.key('stage.' + beforeStageConfig['stageType']);
//             await this.updater.data();
//             let lastStage = this.updater.role.get('stage.' + beforeStageConfig['stageType']);
//             if (lastStage >= stageConfig["stageIdbefore"]) {
//                 if (lastHangStage != id) {
//                     this.updater.role.set('lastHangStage', id);
//                     await this.updater.save();
//                 }
//             }
//         } else {
//             if (lastHangStage != id) {
//                 this.updater.role.set('lastHangStage', id);
//                 await this.updater.save();
//             }
//         }
//     }
//     //判断前置条件
//     if (stageConfig["beforeStage"]) {
//         let beforeStageConfig = this.config("stage", stageConfig["beforeStage"]);
//         if (!beforeStageConfig) {
//             beforeStageConfig = this.config("onHookBattle", stageConfig["beforeStage"]);
//             if (!beforeStageConfig) {
//                 return this.quick_error("m2sgrbs1", "关卡配置不存在", stageConfig["beforeStage"]);
//             }
//         }
//         this.updater.role.key('stage.' + beforeStageConfig['stageType']);
//         await this.updater.data();
//         let lastStage = this.updater.role.get('stage.' + beforeStageConfig['stageType']);
//         if (lastStage < stageConfig["beforeStage"]) {
//             return this.quick_error("m2sgrbs1", "未满足关卡前置条件", id);
//         }
//     }
//     if (stageConfig['stageAllType'] == 1 && hookStageFlag) {
//         this.updater.role.set('lastStage', id);
//         await this.updater.save();
//     }
//     //这里要区分stageType 是主线还是资源关或者其他
//     //主线要区分是打新关卡还是在老关卡挂机
//     let waveList;
//     if (!hookStageFlag) {
//         waveList = stageConfig.stageWave;
//         battleData.wave = stageConfig.stageWave;
//     } else {
//         waveList = stageConfig.hookWave;
//         battleData.wave = stageConfig.hookWave;
//     }
//     battleData["wave"] = waveList;
//     battleData["waveBase"] = waveList;
//     for (let k = 0; k < waveList.length; k++) {
//         if (waveList[k] == 0) {
//             break;
//         }
//         let waveID = waveList[k];
//         let waveConfig = this.config("wave", waveID);
//         if (!waveConfig) {
//             return this.quick_error("m2sgrbs1", "关卡配置不存在", waveID);
//         }
//         // if(battleData[k]==undefined) {
//         //     battleData[k] = {}    
//         // }
//         for (let i = 0; i <= waveConfig.Coll.length; i++) {
//             let Coll = waveConfig.Coll[i]
//             if (Coll == undefined) {
//                 continue;
//             }
//             for (let j = 0; j < Coll.number; j++) {
//                 let reward = [];
//                 if (Coll.box) {
//                     let { err, ret } = this.library("item/group", Coll.box, 1); //this.updater.item.group(Coll.box);
//                     if (err) {
//                         return this.error(err, ret);
//                     }
//                     reward = reward.concat(ret);
//                     // reward.push(ret);
//                 }
//                 if (Coll.starReward) {
//                     reward.push({ "id": YELLOW, "num": Coll.starReward, "key": reward.length });
//                 }
//                 if (Coll.expReward) {
//                     reward.push({ "id": EXP, "num": Coll.expReward, "key": reward.length })
//                 }

//                 // let {err, ret} = this.updater.item.group(Coll.box);
//                 // if (err) {
//                 //     return this.error(err, ret);
//                 // }
//                 battleData['monsterNum']++
//                 let waveData = { "id": battleData['monsterNum'], "mid": Coll.waveKey, "reward": reward }
//                 if (battleData[k] == undefined) {
//                     battleData[k] = new Array();
//                 }
//                 battleData[k].push(waveData);
//             }
//         }
//     }
//     let battleCache = this.model.redis("battleCache", this.sid);
//     let battleTempData = await battleCache.get(this.uid);
//     if (battleTempData != null) {
//         await battleCache.del(battleTempData.stageID);
//     }
//     //创建战斗数据
//     let ttl = 1 * 24 * 3600 //有效期1天
//     //往redis里写怪物数据队列
//     await battleCache.set(battleData.id, battleData, ttl)
//     //返回所有的怪物数据信息
//     return 0;
// }

// /**
//  * @name getMonster
//  * 拉取怪物信息
//  */
// exports.getMonster = async function () {
//     let battleCache = this.model.redis("battleCache", this.sid);
//     let battleData = await battleCache.get(this.uid);
//     if (battleData == null) {
//         return this.quick_error("m2sgrbs1", "没有已生成的怪物信息");
//     }
//     // console.log("data:",battleData);
//     let waveList = JSON.parse(battleData['wave']);
//     let waveBase = JSON.parse(battleData['waveBase']);
//     let flag = false;
//     if (waveList.length == 0) {
//         flag = true;
//     }
//     let site = waveBase.length - waveList.length;
//     if (battleData[site] == undefined) {
//         flag = true;
//     }
//     // console.log("base wave List:",waveList)
//     //判断下这关是否已经通关过了
//     this.updater.role.key('stage');
//     await this.updater.data();
//     //区分下stage的类型
//     // let  lastStage = this.updater.role.get('stage');
//     let id = JSON.parse(battleData['stageID']);
//     let stageConfig = this.config("stage", id);
//     let hookStageFlag = false;
//     if (!stageConfig) {
//         stageConfig = this.config("onHookBattle", id);
//         if (!stageConfig) {
//             return this.quick_error("m2sgrbs1", "关卡配置不存在", id);
//         }
//         hookStageFlag = true;
//         stageConfig['stageType'] = "normal";
//     }
//     this.updater.role.key('stage.' + stageConfig['stageType']);
//     await this.updater.data();
//     // let lastStage = this.updater.role.get('stage.' + stageConfig['stageType']);
//     // if (lastStage < id && stageConfig['stageAllType'] == 1) {
//     //     flag = false;
//     // }

//     if (flag && hookStageFlag) {
//         battleData['wave'] = stageConfig.hookWave;
//         waveList = stageConfig.hookWave;
//         let index = JSON.parse(battleData['monsterNum']);
//         for (let k = 0; k < stageConfig.hookWave.length; k++) {
//             if (stageConfig.hookWave[k] == 0) {
//                 break;
//             }
//             let waveID = stageConfig.hookWave[k];
//             let waveConfig = this.config("wave", waveID);
//             if (!waveConfig) {
//                 return this.quick_error("m2sgrbs1", "关卡配置不存在", waveID);
//             }
//             for (let i = 0; i < waveConfig.Coll.length; i++) {
//                 let Coll = waveConfig.Coll[i]
//                 for (let j = 0; j < Coll.number; j++) {
//                     let reward = [];
//                     if (Coll.box) {
//                         let { err, ret } = this.library("item/group", Coll.box, 1); //this.updater.item.group(Coll.box);
//                         if (err) {
//                             return this.error(err, ret);
//                         }
//                         reward = reward.concat(ret);
//                         // reward.push(ret);
//                     }
//                     if (Coll.starReward) {
//                         reward.push({ "id": 60100002, "num": Coll.starReward, "key": reward.length });
//                     }
//                     if (Coll.expReward) {
//                         reward.push({ "id": 60100001, "num": Coll.expReward, "key": reward.length })
//                     }
//                     index++
//                     let waveData = { "id": index, "mid": Coll.waveKey, "reward": reward }
//                     // let  waveData = {"waveID":Coll.waveID,"mid":Coll.waveKey,"reward":reward};
//                     // starBuff.monster.push(waveData);
//                     // let {err, ret} = this.updater.item.group(Coll.box);
//                     // if (err) {
//                     //     return this.error(err, ret);
//                     // }
//                     if (battleData[k] == undefined) {
//                         battleData[k] = new Array();
//                     }
//                     battleData[k].push(waveData);
//                     battleData['monsterNum'] = index;
//                 }
//             }
//         }
//         let battleCache = this.model.redis("battleCache", this.sid);
//         //创建战斗数据
//         let ttl = 1 * 24 * 3600 //有效期1天
//         //往redis里写怪物数据队列
//         await battleCache.set(battleData.id, battleData, ttl)
//         // return JSON.parse(battleData[waveList[0]])
//     }
//     site = waveBase.length - waveList.length;
//     if (battleData[site] == undefined) {
//         return [];
//     }
//     // console.log("toDO:",battleData[waveList[0]]);
//     // return battleData[waveList[0]];
//     if (flag) {
//         if (typeof battleData[site] === 'string') {
//             return JSON.parse(battleData[site]);
//         }
//         return battleData[site];
//     } else {
//         return JSON.parse(battleData[site]);
//     }
// }



// /**
//  * @name killMonster
//  * @param string monsterList 杀死怪物ID,用','分割。
//  * 结算怪物奖励
//  */
// exports.killMonster = async function () {
//     const ss = this.get('monsterList', 'string');
//     let monsterListArgs = ss.split(',');
//     let battleCache = this.model.redis("battleCache", this.sid);
//     let redisData = await battleCache.get(this.uid);
//     if (!redisData) {
//         return this.quick_error("m2sgrbs1", "data error", redisData);
//     }
//     if (!redisData['wave']) {
//         return this.quick_error("m2sgrbs1", "data error wave", redisData);
//     }
//     let waveList = JSON.parse(redisData['wave']);
//     let waveBase = JSON.parse(redisData['waveBase'])
//     let site = waveBase.length - waveList.length;
//     if (redisData[site] == undefined) {
//         return this.quick_error("m2sgrbs1", "怪物列表不存在", ss);
//     }
//     let rewardList = JSON.parse(redisData[site]);
//     // let waveID = waveList[site];
//     let hookStageFlag = false;
//     let stageConfig = this.config("stage", redisData.stageID);
//     if (!stageConfig) {
//         stageConfig = this.config("onHookBattle", redisData.stageID);
//         if (!stageConfig) {
//             return this.quick_error("m2sgrbs1", "关卡配置不存在", redisData.stageID);
//         }
//         hookStageFlag = true;
//         stageConfig['stageType'] = "normal";
//         // return this.quick_error("m2sgrbs1", "关卡配置不存在", redisData.stageID);
//     }
//     this.updater.role.key('stage.' + stageConfig['stageType']);
//     //如果是资源关，要拿daily里的数据   resourseStar:今日次数
//     this.updater.daily.key("record." + stageConfig['stageType'])
//     this.updater.daily.key("record." + "12")
//     this.updater.role.key("fWbossX")
//     this.updater.role.key("fWbossID")
//     // this.updater.role.key('battleArea');//战斗区
//     await this.updater.data();
//     //读取现在的战场上的角色
//     // let battleList = this.updater.role.get('battleArea') || {};
//     // for (let key in battleList) {
//     //     this.updater.item.key(key);
//     // }
//     // await this.updater.data();
//     // let battleAreaList = {};
//     // for (let key in battleList) {
//     //     battleAreaList[key] = this.updater.item.get(key);
//     // }
//     let fWbossX = this.updater.role.get("fWbossX") || 0;
//     // let lastStage = this.updater.role.get('stage.' + stageConfig['stageType']);
//     //判断是否是挂机
//     let itemBuff = {};
//     let hangFlag = 0;
//     let fWbossXFlag = 0;
//     let monsterList = monsterListArgs
//         .map(monsterID => parseInt(monsterID))
//         .filter(killID => rewardList.some(reward => parseInt(reward.id) === killID));
//     if (monsterList.length === 0) {
//         return this.quick_error("m2sgrbs1", "怪物列表不存在", ss);
//     }
//     // const { yeBuff, boxBuff, expBuff } = await calculateMoodBuffs.call(this, battleAreaList, monsterList);
//     // console.log("yeBuff, boxBuff, expBuff:", yeBuff, boxBuff, expBuff);
//     // let fWboss = this.model.mongo('fWboss', this.sid);
//     // //判断是否已经发现了好友boss DEBUG
//     let starID = this.updater.role.get('fWbossID') || 0;
//     let fWboss = this.model.mongo('fWboss', this.sid);
//     let fWbossData = await fWboss.mget(this.uid) || [];
//     if (starID != 0) {
//         //判断是否有流星
//         fWbossXFlag = 1;
//     } else {
//         //判断是否有正在打的boss
//         for (let i in fWbossData) {
//             if (fWbossData[i].uid == this.uid) {
//                 fWbossXFlag = 1;
//                 break;
//             }
//             // if (fWbossData[i].end == 0) {
//             //     fWbossXFlag = 1;
//             //     break;
//             // }
//         }
//     }

//     if (hookStageFlag) {
//         //是挂机
//         //判断是否有流星buff杀怪资源加成，只在挂机里起效
//         hangFlag = 1;
//         this.updater.role.key('starBuff');
//         // this.updater.role.key('lastHangStage');
//         await this.updater.data();
//         // let lastHangStage = this.updater.role.get('lastHangStage')||0;
//         // if(lastHangStage != redisData.stageID){
//         //     this.updater.role.set('lastHangStage',redisData.stageID);
//         // }
//         let starBuff = this.updater.role.get('starBuff');
//         let nowtime = this.updater.time;
//         for (let i = 0; i < starBuff.itemBuff.length; i++) {
//             if (starBuff.itemBuff[i].endTime < nowtime) {
//                 starBuff.itemBuff.splice(i, 1);
//                 i--;
//                 continue;
//             }
//             //要判断最大的收益类型
//             if (itemBuff.hasOwnProperty(starBuff.itemBuff[i].val)) {
//                 if (itemBuff[starBuff.itemBuff[i].val].randomVal < starBuff.itemBuff[i].randomVal) {
//                     itemBuff[starBuff.itemBuff[i].val] = starBuff.itemBuff[i];
//                 }
//             } else {
//                 itemBuff[starBuff.itemBuff[i].val] = starBuff.itemBuff[i];
//             }
//         }
//     }
//     let rewardMap = {};
//     monsterList.forEach(killID => {
//         let rewardIndex = rewardList.findIndex(reward => parseInt(reward.id) === killID);
//         if (rewardIndex !== -1) {
//             let reward = rewardList[rewardIndex];
//             for (let r = 0; r < reward.reward.length; r++) {
//                 let rewardItem = reward.reward[r];
//                 if (itemBuff.hasOwnProperty(rewardItem.id)) {
//                     //物品buff叠加
//                     rewardItem.num = parseInt(rewardItem.num * (1000 + itemBuff[rewardItem.id].randomVal) / 1000);
//                 }
//                 if (rewardMap.hasOwnProperty(rewardItem.id)) {
//                     rewardMap[rewardItem.id] += rewardItem.num;
//                 } else {
//                     rewardMap[rewardItem.id] = rewardItem.num;
//                 }
//             }
//             rewardList.splice(rewardIndex, 1);
//             //判断是否是挂机和是否已拥有好友boss
//             if (hangFlag && !fWbossXFlag) {
//                 let meteorID = stageConfig['meteorGroup'];
//                 // //在此进行是否刷新出好友boss的判断
//                 // //根据fWbossX计算刷新概率，如果 (fwbossX-addRateNum) 大于0 ,rate = meteorRate+(fwbossX-addRateNum)*addRate
//                 // //否则 rate = meteorRate
//                 let rate = 0;
//                 let addRateNum = 0;
//                 let addRate = 0;
//                 let meteorConfig = this.config("friendBossMeteor", meteorID);
//                 if (!meteorConfig) {
//                     return this.quick_error("m2sgrbs1", "流星配置不存在", meteorID);
//                 }
//                 //计算本次刷新概率
//                 if (fWbossX > meteorConfig['addRateNum']) {
//                     addRateNum = fWbossX - meteorConfig['addRateNum'];
//                 }
//                 addRate = meteorConfig['addRate'] * addRateNum;
//                 rate = meteorConfig['meteorRate'] + addRate;
//                 //rate是万分比，计算本次是否会刷出boss
//                 let randomNum = Math.floor(Math.random() * 10000);
//                 if (randomNum < rate) {
//                     //刷新出boss
//                     fWbossXFlag = 1;
//                     fWbossX = 0;
//                     //构建boss数据
//                     //生成bossID,bossID的规则是uid+转成64进制的当前时间戳
//                     // let bossID = this.uid + this.updater.time.toString(32);
//                     // let bossData = {
//                     //     "bossID": bossID,//bossID
//                     //     "uid": this.uid,//boss所属玩家
//                     //     "findTime": this.updater.time,//发现时间
//                     //     "startTime": 0,//开始时间
//                     //     "killTime": 0,//击杀时间
//                     //     "hp": 0,//血量
//                     //     "shareList": [],//分享列表
//                     //     "findReward": '',//发现奖励
//                     //     "killReward": '',//击杀奖励
//                     // };
//                     //     // let redisTestModel = this.model.redis('fWboss', this.sid)

//                     //     await fWboss.add(this.uid, bossData);
//                     //记录下发现的bossID
//                     //TODO:pts关闭功能
//                     this.updater.role.set("fWbossID", meteorID);
//                 } else {
//                     fWbossX++
//                 }
//                 //TODO:pts关闭功能
//                 this.updater.role.set("fWbossX", fWbossX);
//             }
//         }
//     });
//     // 给奖励计算buff
//     for (const [id, reward] of Object.entries(rewardMap)) {
//         const parsedId = parseInt(id);
//         const buff = 0;// parsedId === YELLOW ? yeBuff : parsedId === EXP ? expBuff : boxBuff;
//         const updatedReward = parseInt(reward * (100 + buff) / 100);
//         if (updatedReward) {
//             this.updater.add(parsedId, updatedReward);
//         }
//     }
//     //击杀黑黑
//     this.updater.record.add(12, monsterList.length);
//     this.updater.daily.add("record." + "12", monsterList.length);
//     redisData[site] = rewardList;
//     if (rewardList.length == 0) {
//         waveList.splice(0, 1);
//         redisData["wave"] = waveList;
//         delete redisData[site];
//         await battleCache.del(redisData.id, site);
//     }
//     await battleCache.set(redisData.id, redisData);
//     await this.updater.save()
//     // console.log("yeBuff, boxBuff, expBuff 2 :", yeBuff, boxBuff, expBuff);
//     return "";
//     return { "yeBuff": yeBuff, "boxBuff": boxBuff, "expBuff": expBuff }
// }


// async function calculateMoodBuffs(battleAreaList, monsterList) {
//     try {
//         //挨个扣心情值
//         let yeBuff = 0
//         let boxBuff = 0
//         let expBuff = 0
//         let completeLike = {};
//         for (const j in battleAreaList) {
//             like.updateMood.call(this, battleAreaList[j], 0);
//             let addLikeNum = 0;
//             const battleArea = battleAreaList[j];
//             const moodConfig = this.config("mood");
//             const moodConfigArray = Object.values(moodConfig);
//             const moodSingleConfig = moodConfigArray.find(config => {
//                 if (battleArea.mood.val == 0 && config.stageMark[0] == 0) {
//                     return true;
//                 } else {
//                     return battleArea.mood.val > config.stageMark[0] && battleArea.mood.val <= config.stageMark[1];
//                 }
//             });
//             if (!moodSingleConfig) {
//                 console.log("not find config:", battleArea.mood.val);
//                 continue;
//             }
//             const addYeBuff = moodSingleConfig.ystarOutput || 0;
//             const addBoxBuff = moodSingleConfig.boxOutput || 0;
//             const addExpBuff = moodSingleConfig.expOutput || 0;
//             const addLikeVal = moodSingleConfig.ifFavorabilityIncrase || 0;
//             const loseMoodEachMonster = this.config('base', 'loseMoodEachMonster').val;
//             const moodTurnLike = this.config('base', 'moodTurnLike').val;
//             yeBuff += addYeBuff;
//             boxBuff += addBoxBuff;
//             expBuff += addExpBuff;
//             // console.log("yeBuff, boxBuff, expBuff1.1:", yeBuff, boxBuff, expBuff);
//             const subMood = (battleArea.mood.val - monsterList.length * loseMoodEachMonster) > 0 ? monsterList.length * loseMoodEachMonster : battleArea.mood.val;
//             battleArea.mood.val -= subMood;
//             addLikeNum += subMood * moodTurnLike * addLikeVal;
//             battleArea.mood.val = Math.max(battleArea.mood.val, 0);
//             this.updater.item.set(battleArea._id, "mood", battleArea.mood);
//             if (moodSingleConfig.ifFavorabilityIncrase) {
//                 const unitConfig = this.config('unit', battleArea.id);
//                 let likeID = battleArea.id
//                 if (!unitConfig) {
//                     throw this.quick_error("M2saghge40", "角色数据不存在", id);
//                 }
//                 if (unitConfig.giftGroup === -1) {
//                     continue;
//                 } else if (unitConfig.giftGroup !== 0) {
//                     likeID = unitConfig.giftGroup;
//                 }
//                 if (!completeLike[likeID]) {
//                     completeLike[likeID] = addLikeNum;
//                 } else {
//                     completeLike[likeID] += addLikeNum;
//                 }
//             }
//         }
//         const ystarMaxBuff = this.config('base', 'ystarMaxBuff').val;
//         const expMaxBuff = this.config('base', 'expMaxBuff').val;
//         const ystarMinBuff = this.config('base', 'ystarMinBuff').val;
//         const expMinBuff = this.config('base', 'expMinBuff').val;
//         const boxMinBuff = this.config('base', 'boxMinBuff').val;
//         //计算产出buff
//         yeBuff = Math.min(Math.max(yeBuff, ystarMinBuff), ystarMaxBuff);
//         expBuff = Math.min(Math.max(expBuff, expMinBuff), expMaxBuff);
//         boxBuff = Math.max(boxBuff, boxMinBuff);
//         // console.log("yeBuff, boxBuff, expBuff1.2:", yeBuff, boxBuff, expBuff);
//         //增加好感度
//         for (const likeID in completeLike) {
//             this.updater.record.key(like.LIKE_LV_RECORD_PREFIX + likeID);
//             this.updater.record.key(like.LIKE_EXP_RECORD_PREFIX + likeID);
//             await this.updater.data();
//             let lexp = this.updater.record.get(like.LIKE_EXP_RECORD_PREFIX + likeID) || 0;
//             let llv = this.updater.record.get(like.LIKE_LV_RECORD_PREFIX + likeID) || 0;
//             like.updateExp.call(this, likeID, lexp, llv, completeLike[likeID]);
//         }
//         // console.log("yeBuff, boxBuff, expBuff 222:", yeBuff, boxBuff, expBuff);
//         return { yeBuff, boxBuff, expBuff };
//     } catch (err) {
//         return err;
//     }
// }



// /**
//  * @name endBattle
//  * @param int id 关卡ID
//  * 结束战斗
//  */
// exports.endBattle = async function () {
//     let id = this.get('id', 'int');
//     if (!id) {
//         return this.quick_error('N2BS1', "参数缺失");
//     }
//     let battleCache = this.model.redis("battleCache", this.sid);
//     let redisData = await battleCache.get(this.uid);
//     if (redisData == null) {
//         return { "win": false };
//     }
//     await battleCache.del(redisData.id);
//     let waveList = JSON.parse(redisData['wave'])
//     for (let i = 0; i < waveList.length; i++) {
//         if (waveList[i] != 0) {
//             return { "win": false };
//         }
//     }
//     let stageConfig = this.config("stage", redisData.stageID);
//     if (!stageConfig) {
//         return this.quick_error("m2sgrbs1", "关卡配置不存在", redisData.stageID);
//     }
//     this.updater.role.key('stage.' + stageConfig['stageType']);
//     //如果是资源关，要拿daily里的数据   resourseStar:今日次数
//     this.updater.daily.key("record." + stageConfig['stageType'])
//     // this.updater.daily.key("record."+stageConfig['stageAllType']+':'+resoureConfig['groupId'])
//     await this.updater.data();
//     let lastStage = this.updater.role.get('stage.' + stageConfig['stageType']);

//     let tKey = [];
//     //需要判断是主线通关，还是主线挂机还是资源关
//     switch (stageConfig['stageAllType']) {
//         case 1:
//             //普通类型关卡
//             //写入数据
//             // this.updater.role.set('stage.'+stageConfig['stageType'],redisData.stageID);
//             //每日通关统计
//             this.updater.record.add(19, 1);
//             this.updater.daily.add("record." + stageConfig['stageType'], 1);
//             break;
//         case 2:
//             //大世界关卡
//             //写入数据
//             // this.updater.role.set('stage.'+stageConfig['stageType'],redisData.stageID);
//             //每日通关统计
//             this.updater.daily.add("record." + stageConfig['stageType'], 1);
//             break;
//         case 3:
//             //资源关关卡
//             //stageRecovery
//             let resoureConfig = this.config("timeSharingStage", stageConfig['stageType']);
//             if (!resoureConfig) {
//                 return this.quick_error("m2sgrbs1", "关卡配置不存在", stageConfig['stageType']);
//             }
//             let key = "record." + stageConfig['stageAllType'] + ':' + resoureConfig['groupId'];
//             this.updater.daily.key(key);
//             await this.updater.data();
//             //次数判断
//             let stageNum = this.updater.daily.get(key) || 0;
//             if (stageNum >= resoureConfig["maxPassTime"]) {
//                 return this.quick_error("m2sgrbs1", "超过允许的最大次数", redisData.stageID);
//             }
//             //每日通关统计
//             this.updater.record.add(20, 1);
//             tKey.push("record.20");
//             var recordID_byAllResourseLevel = 20 + redisData.stageID.substr(redisData.stageID.length - 2, 2);
//             var recordConfig_byAllResourseLevel = this.config("record", recordID_byAllResourseLevel);
//             if (recordConfig_byAllResourseLevel) {
//                 this.updater.record.add(recordID_byAllResourseLevel, 1);
//             }
//             switch (stageConfig["stageType"]) {
//                 case "resourseExpStar":
//                     this.updater.record.add(24, 1);
//                     // this.updater.daily.add("record.24",1);
//                     tKey.push("record.24");
//                     var stageID = stageConfig['stageID'].toString();
//                     var recordID = 24 + stageID.substr(stageID.length - 2, 2);
//                     var recordConfig = this.config("record", recordID);
//                     if (recordConfig) {
//                         this.updater.record.add(recordID, 1);
//                     }
//                     break;
//                 case "resourseUpgradeZero":
//                     this.updater.record.add(25, 1);
//                     this.updater.record.add(22, 1);
//                     // this.updater.daily.add("record."+25,1);
//                     // this.updater.daily.add("record."+22,1);
//                     tKey.push("record." + 25);
//                     tKey.push("record." + 22);
//                     var stageID = stageConfig['stageID'].toString();
//                     var recordID = 25 + stageID.substr(stageID.length - 2, 2);
//                     var recordConfig = this.config("record", recordID);
//                     if (recordConfig) {
//                         this.updater.record.add(recordID, 1);
//                     }
//                     recordID = 22 + stageID.substr(stageID.length - 2, 2);
//                     recordConfig = this.config("record", recordID);
//                     if (recordConfig) {
//                         this.updater.record.add(recordID, 1);
//                     }
//                     break;
//                 case "resourseUpgradeOri":
//                     this.updater.record.add(26, 1);
//                     this.updater.record.add(22, 1);
//                     // this.updater.daily.add("record."+26,1);
//                     // this.updater.daily.add("record."+22,1);
//                     tKey.push("record." + 26);
//                     tKey.push("record." + 22);
//                     var stageID = stageConfig['stageID'].toString();
//                     var recordID = 26 + stageID.substr(stageID.length - 2, 2);
//                     var recordConfig = this.config("record", recordID);
//                     if (recordConfig) {
//                         this.updater.record.add(recordID, 1);
//                     }
//                     recordID = 22 + stageID.substr(stageID.length - 2, 2);
//                     recordConfig = this.config("record", recordID);
//                     if (recordConfig) {
//                         this.updater.record.add(recordID, 1);
//                     }
//                     break;
//                 case "resourseUpgradeInf":
//                     this.updater.record.add(27, 1);
//                     this.updater.record.add(22, 1);
//                     // this.updater.daily.add("record."+27,1);
//                     // this.updater.daily.add("record."+22,1);
//                     tKey.push("record." + 27);
//                     tKey.push("record." + 22);
//                     var stageID = stageConfig['stageID'].toString();
//                     var recordID = 27 + stageID.substr(stageID.length - 2, 2);
//                     var recordConfig = this.config("record", recordID);
//                     if (recordConfig) {
//                         this.updater.record.add(recordID, 1);
//                     }
//                     recordID = 22 + stageID.substr(stageID.length - 2, 2);
//                     recordConfig = this.config("record", recordID);
//                     if (recordConfig) {
//                         this.updater.record.add(recordID, 1);
//                     }
//                     break;
//                 case "resourseSkillZero":
//                     this.updater.record.add(28, 1);
//                     this.updater.record.add(23, 1);
//                     // this.updater.daily.add("record."+28,1);
//                     // this.updater.daily.add("record."+23,1);
//                     tKey.push("record." + 28);
//                     tKey.push("record." + 23);
//                     var stageID = stageConfig['stageID'].toString();
//                     var recordID = 28 + stageID.substr(stageID.length - 2, 2);
//                     var recordConfig = this.config("record", recordID);
//                     if (recordConfig) {
//                         this.updater.record.add(recordID, 1);
//                     }
//                     break;
//                 case "resourseSkillOri":
//                     this.updater.record.add(29, 1);
//                     this.updater.record.add(23, 1);
//                     // this.updater.daily.add("record."+29,1);
//                     // this.updater.daily.add("record."+23,1);
//                     tKey.push("record." + 29);
//                     tKey.push("record." + 23);
//                     var stageID = stageConfig['stageID'].toString();
//                     var recordID = 29 + stageID.substr(stageID.length - 2, 2);
//                     var recordConfig = this.config("record", recordID);
//                     if (recordConfig) {
//                         this.updater.record.add(recordID, 1);
//                     }
//                     break;
//                 case "resourseSkillInf":
//                     this.updater.record.add(30, 1);
//                     this.updater.record.add(23, 1);
//                     // this.updater.daily.add("record."+30,1);
//                     // this.updater.daily.add("record."+23,1);
//                     tKey.push("record." + 30);
//                     tKey.push("record." + 23);
//                     var stageID = stageConfig['stageID'].toString();
//                     var recordID = 30 + stageID.substr(stageID.length - 2, 2);
//                     var recordConfig = this.config("record", recordID);
//                     if (recordConfig) {
//                         this.updater.record.add(recordID, 1);
//                     }
//                     break;
//                 case "chipInstance1":
//                 case "chipInstance2":
//                 case "chipInstance3":
//                 case "chipInstance4":
//                 case "chipInstance5":
//                     // this.updater.record.add(30,1);
//                     // this.updater.record.add(23,1);
//                     // // this.updater.daily.add("record."+30,1);
//                     // // this.updater.daily.add("record."+23,1);
//                     // tKey.push("record."+30);
//                     // tKey.push("record."+23);
//                     // var stageID = stageConfig['stageID'].toString();
//                     // var recordID = 30+stageID.substr(stageID.length - 2, 2);
//                     // var recordConfig = this.config("record",recordID);
//                     // if(recordConfig){
//                     //     this.updater.record.add(recordID,1);
//                     // }
//                     this.updater.record.add(21, 1);
//                     tKey.push("record." + 21);
//                     var stageID = stageConfig['stageID'].toString();
//                     var recordID = 21 + stageID.substr(stageID.length - 2, 2);
//                     var recordConfig = this.config("record", recordID);
//                     if (recordConfig) {
//                         this.updater.record.add(recordID, 1);
//                     }
//                     break;
//                 // case "chipInstance2":
//                 //     this.updater.record.add(21, 1);
//                 //     tKey.push("record." + 21);
//                 //     var stageID = stageConfig['stageID'].toString();
//                 //     var recordID = 21 + stageID.substr(stageID.length - 2, 2);
//                 //     var recordConfig = this.config("record", recordID);
//                 //     if (recordConfig) {
//                 //         this.updater.record.add(recordID, 1);
//                 //     }
//                 //     break;
//             }
//             // this.updater.daily.add("record."+3+':'+1,1);
//             // await this.updater.save();
//             this.updater.daily.add(key, 1);
//             break;
//         // case 4:
//         //     //芯片关关卡
//         //     //stageRecovery
//         //     let resoureConfig1 = this.config("timeSharingStage", stageConfig['stageType']);
//         //     if (!resoureConfig1) {
//         //         return this.quick_error("m2sgrbs1", "关卡配置不存在", stageConfig['stageType']);
//         //     }
//         //     this.updater.daily.key("record."+stageConfig['stageAllType']+':'+resoureConfig['groupId'])
//         //     await this.updater.data();
//         //     //次数判断
//         //     let stageNum1=this.updater.daily.get("record."+stageConfig['stageAllType']+':'+resoureConfig['groupId'])||0;
//         //     if(stageNum1 >=resoureConfig["maxPassTime"]){
//         //         return this.quick_error("m2sgrbs1", "超过允许的最大次数", redisData.stageID);
//         //     }
//         //     //每日通关统计
//         //     // if(stageConfig['stageType']=="chipInstance"){
//         //             this.updater.record.add(21,1);
//         //             var stageID = stageConfig['stageID'].toString();
//         //             var recordID = 21+stageID.substr(stageID.length - 2, 2);
//         //             var recordConfig = this.config("record",recordID);
//         //             if(recordConfig){
//         //                 this.updater.record.add(recordID,1);
//         //             }
//         //     // }
//         //     // this.updater.daily.add("record."+3+':'+1,1);
//         //     this.updater.daily.add("record."+stageConfig['stageAllType']+':'+resoureConfig['groupId'],1);
//         //     break;
//         default:
//             return this.quick_error("m2sgrbs1", "关卡配置不存在", redisData.stageID);
//     }
//     //给首通奖励
//     if (lastStage < redisData.stageID) {
//         //写入数据
//         this.updater.role.set('stage.' + stageConfig['stageType'], redisData.stageID);
//         this.updater.add(stageConfig["firstReward"], 1);
//         for (let item of stageConfig["itemDrop"]) {
//             this.updater.add(item.id, item.num);
//         }

//         // if (stageConfig['stageAllType'] == 1) {
//         //     //首通主线关卡增加point
//         //     this.updater.role.add('hangPoint', 1);
//         // }
//     }
//     //给普通奖励
//     if (stageConfig["reward"].length != 0) {
//         for (let i = 0; i < stageConfig["reward"].length; i++) {
//             if (stageConfig["reward"][i] != 0) {
//                 this.updater.add(stageConfig["reward"][i], 1);
//             }
//         }
//         // this.updater.add(stageConfig["reward"], 1);
//     }

//     // this.updater.record.add(18,1);
//     var recordConfig = this.config("record", 18 + redisData.stageID);
//     if (recordConfig) {
//         this.updater.record.add(18 + redisData.stageID, 1);
//     }
//     await this.updater.save();
//     for (let k in tKey) {
//         this.updater.daily.add(tKey[k], 1);
//     }
//     await this.updater.save();
//     return { "win": true }
//     // }

//     // return  {"win":true};

//     // const ss=this.get('monsterList','string');
//     // let monsterList=ss.split(',');
//     // let battleCache = this.model.redis("battleCache",this.sid);
//     // let redisData = await battleCache.get(this.uid);
//     // let waveList = JSON.parse(redisData['wave'])
//     // let rewardList =JSON.parse(redisData[waveList[0]]);
//     // let waveID = waveList[0]
//     // //验算
//     // for(let i = 0;i<monsterList.length;i++){
//     //     let killID = parseInt(monsterList[i]);
//     //     for(let j = 0;j<rewardList.length;j++){
//     //         let baseID = parseInt(rewardList[j].mid);
//     //         if(baseID==killID){
//     //             //找到对应数据
//     //             this.updater.add(rewardList[j].reward.id,rewardList[j].reward.num);
//     //             rewardList.splice(j,1);
//     //             j--;
//     //         }
//     //     }
//     // }
//     // redisData[waveID] = rewardList
//     // //给奖励
//     // if(rewardList.length==0){
//     //     waveList.splice(0,1);
//     //     redisData["wave"] = waveList;
//     //     delete  redisData[waveID];
//     //     await battleCache.del(redisData.id,waveID);
//     // }
//     // await battleCache.set(redisData.id,redisData);
//     // return this.updater.save()
//     // return JSON.parse(battleData[battleData["wave"]]);
// }


// /**
//  * @name swapStage
//  * @param int id 关卡ID
//  * @param int num 扫荡次数
//  * 扫荡关卡
//  */
// exports.swapStage = async function () {
//     let id = this.get('id', 'int');
//     let num = this.get('num', 'int');
//     if (!id && !num) {
//         return this.quick_error('N2BS1', "参数缺失");
//     }
//     let stageConfig = this.config("stage", id);
//     if (!stageConfig) {
//         return this.quick_error("m2sgrbs1", "关卡配置不存在", id);
//     }
//     //debug  字段暂时没有
//     // if(!stageConfig.swap) {
//     //     return this.quick_error("m2sgrbs1", "关卡不允许扫荡", id);
//     // }
//     this.updater.role.key('stage.' + stageConfig['stageType']);
//     //如果是资源关，要拿daily里的数据   resourseStar:今日次数
//     this.updater.daily.key("record." + stageConfig['stageType'])
//     await this.updater.data();
//     let tKey = [];
//     //需要判断是主线通关，还是主线挂机还是资源关
//     switch (stageConfig['stageAllType']) {
//         case 1:
//             //普通类型关卡
//             //写入数据
//             // this.updater.role.set('stage.'+stageConfig['stageType'],redisData.stageID);
//             //每日通关统计
//             this.updater.record.add(19, 1);
//             this.updater.daily.add("record." + stageConfig['stageType'], num);
//             break;
//         case 2:
//             //大世界关卡
//             //写入数据
//             // this.updater.role.set('stage.'+stageConfig['stageType'],redisData.stageID);
//             //每日通关统计
//             this.updater.daily.add("record." + stageConfig['stageType'], num);
//             break;
//         case 3:
//             //资源关关卡
//             //stageRecovery
//             let resoureConfig = this.config("timeSharingStage", stageConfig['stageType']);
//             if (!resoureConfig) {
//                 return this.quick_error("m2sgrbs1", "关卡配置不存在", stageConfig['stageType']);
//             }
//             let key = "record." + stageConfig['stageAllType'] + ':' + resoureConfig['groupId'];
//             this.updater.daily.key(key);
//             await this.updater.data();
//             this.updater.record.add(20, 1);
//             tKey.push("record.20");
//             //次数判断
//             let stageNum = this.updater.daily.get("record." + stageConfig['stageAllType'] + ':' + resoureConfig['groupId']) || 0;
//             if ((stageNum + num) > resoureConfig["maxPassTime"]) {
//                 return this.quick_error("m2sgrbs1", "超过允许的最大次数", id);
//             }
//             //写入数据
//             // this.updater.role.set('stage.'+stageConfig['stageType'],redisData.stageID);
//             //每日通关统计
//             switch (stageConfig["stageType"]) {
//                 case "resourseExpStar":
//                     this.updater.record.add(24, num);
//                     tKey.push("record.24");
//                     var stageID = stageConfig['stageID'].toString();
//                     var recordID = 24 + stageID.substr(stageID.length - 2, 2);
//                     var recordConfig = this.config("record", recordID);
//                     if (recordConfig) {
//                         this.updater.record.add(recordID, num);
//                     }
//                     break;
//                 case "resourseUpgradeZero":
//                     this.updater.record.add(25, num);
//                     this.updater.record.add(22, num);
//                     tKey.push("record." + 25);
//                     tKey.push("record." + 22);
//                     var stageID = stageConfig['stageID'].toString();
//                     var recordID = 25 + stageID.substr(stageID.length - 2, 2);
//                     var recordConfig = this.config("record", recordID);
//                     if (recordConfig) {
//                         this.updater.record.add(recordID, num);
//                     }
//                     recordID = 22 + stageID.substr(stageID.length - 2, 2);
//                     recordConfig = this.config("record", recordID);
//                     if (recordConfig) {
//                         this.updater.record.add(recordID, num);
//                     }
//                     break;
//                 case "resourseUpgradeOri":
//                     this.updater.record.add(26, num);
//                     this.updater.record.add(22, num);
//                     tKey.push("record." + 26);
//                     tKey.push("record." + 22);
//                     var stageID = stageConfig['stageID'].toString();
//                     var recordID = 26 + stageID.substr(stageID.length - 2, 2);
//                     var recordConfig = this.config("record", recordID);
//                     if (recordConfig) {
//                         this.updater.record.add(recordID, num);
//                     }
//                     recordID = 22 + stageID.substr(stageID.length - 2, 2);
//                     recordConfig = this.config("record", recordID);
//                     if (recordConfig) {
//                         this.updater.record.add(recordID, num);
//                     }
//                     break;
//                 case "resourseUpgradeInf":
//                     this.updater.record.add(27, num);
//                     this.updater.record.add(22, num);
//                     tKey.push("record." + 27);
//                     tKey.push("record." + 22);
//                     var stageID = stageConfig['stageID'].toString();
//                     var recordID = 27 + stageID.substr(stageID.length - 2, 2);
//                     var recordConfig = this.config("record", recordID);
//                     if (recordConfig) {
//                         this.updater.record.add(recordID, 1);
//                     }
//                     recordID = 22 + stageID.substr(stageID.length - 2, 2);
//                     recordConfig = this.config("record", recordID);
//                     if (recordConfig) {
//                         this.updater.record.add(recordID, num);
//                     }
//                     break;
//                 case "resourseSkillZero":
//                     this.updater.record.add(28, num);
//                     this.updater.record.add(23, num);
//                     tKey.push("record." + 28);
//                     tKey.push("record." + 23);
//                     var stageID = stageConfig['stageID'].toString();
//                     var recordID = 28 + stageID.substr(stageID.length - 2, 2);
//                     var recordConfig = this.config("record", recordID);
//                     if (recordConfig) {
//                         this.updater.record.add(recordID, 1);
//                     }
//                     break;
//                 case "resourseSkillOri":
//                     this.updater.record.add(29, num);
//                     this.updater.record.add(23, num);
//                     tKey.push("record." + 29);
//                     tKey.push("record." + 23);
//                     var stageID = stageConfig['stageID'].toString();
//                     var recordID = 29 + stageID.substr(stageID.length - 2, 2);
//                     var recordConfig = this.config("record", recordID);
//                     if (recordConfig) {
//                         this.updater.record.add(recordID, 1);
//                     }
//                     break;
//                 case "resourseSkillInf":
//                     this.updater.record.add(30, num);
//                     this.updater.record.add(23, num);
//                     tKey.push("record." + 30);
//                     tKey.push("record." + 23);
//                     var stageID = stageConfig['stageID'].toString();
//                     var recordID = 30 + stageID.substr(stageID.length - 2, 2);
//                     var recordConfig = this.config("record", recordID);
//                     if (recordConfig) {
//                         this.updater.record.add(recordID, num);
//                     }
//                     break;

//                 case "chipInstance1":
//                 case "chipInstance2":
//                 case "chipInstance3":
//                 case "chipInstance4":
//                 case "chipInstance5":
//                     // this.updater.record.add(30,1);
//                     // this.updater.record.add(23,1);
//                     // // this.updater.daily.add("record."+30,1);
//                     // // this.updater.daily.add("record."+23,1);
//                     // tKey.push("record."+30);
//                     // tKey.push("record."+23);
//                     // var stageID = stageConfig['stageID'].toString();
//                     // var recordID = 30+stageID.substr(stageID.length - 2, 2);
//                     // var recordConfig = this.config("record",recordID);
//                     // if(recordConfig){
//                     //     this.updater.record.add(recordID,1);
//                     // }
//                     this.updater.record.add(21, num);
//                     tKey.push("record." + 21);
//                     var stageID = stageConfig['stageID'].toString();
//                     var recordID = 21 + stageID.substr(stageID.length - 2, 2);
//                     var recordConfig = this.config("record", recordID);
//                     if (recordConfig) {
//                         this.updater.record.add(recordID, num);
//                     }
//                     break;
//                 // case "chipInstance1":
//                 //     this.updater.record.add(21, num);
//                 //     tKey.push("record." + 21);
//                 //     var stageID = stageConfig['stageID'].toString();
//                 //     var recordID = 21 + stageID.substr(stageID.length - 2, 2);
//                 //     var recordConfig = this.config("record", recordID);
//                 //     if (recordConfig) {
//                 //         this.updater.record.add(recordID, 1);
//                 //     }
//                 //     break;
//                 // case "chipInstance2":
//                 //     this.updater.record.add(21, num);
//                 //     tKey.push("record." + 21);
//                 //     var stageID = stageConfig['stageID'].toString();
//                 //     var recordID = 21 + stageID.substr(stageID.length - 2, 2);
//                 //     var recordConfig = this.config("record", recordID);
//                 //     if (recordConfig) {
//                 //         this.updater.record.add(recordID, num);
//                 //     }
//                 //     break;
//             }
//             this.updater.daily.add("record." + stageConfig['stageAllType'] + ':' + resoureConfig['groupId'], num);
//             break;
//         default:
//             return this.quick_error("m2sgrbs1", "关卡配置不存在", id);
//     }
//     let ticketID = this.config("base", "moppingTicket").val;
//     this.updater.sub(ticketID, num) //扣除扫荡券
//     var recordConfig = this.config("record", 18 + id);
//     if (recordConfig) {
//         this.updater.record.add(18 + redisData.stageID, 1);
//     }
//     //给普通奖励
//     // if (stageConfig["reward"] != 0) {
//     //     for (let i = 0; i < num; i++) {
//     //         this.updater.item.add(stageConfig["reward"], 1);
//     //     }
//     // }
//     if (stageConfig["reward"].length != 0) {
//         for (let i = 0; i < num; i++) {
//             for (let i = 0; i < stageConfig["reward"].length; i++) {
//                 if (stageConfig["reward"][i] != 0) {
//                     this.updater.add(stageConfig["reward"][i], 1);
//                 }
//             }
//         }
//         // this.updater.add(stageConfig["reward"], 1);
//     }
//     await this.updater.save();
//     for (let k in tKey) {
//         this.updater.daily.add(tKey[k], num);
//     }
//     return this.updater.save();
// }

